package com.pisoCalc.resultado;

import java.util.LinkedList;
import java.util.List;

import com.pisoCalc.fondo.AportacionFondo;
import com.pisoCalc.fondo.RelacionFondo;
import com.pisoCalc.inquilino.Inquilino;
import com.pisoCalc.inquilino.OperacionesInquilino;

public class OperacionesResultado {

	/**
	 * Calcula los resultados de los inquilinos pasado por parametro
	 * @param inquilinos lista de inquilinos, del tipo <tt>Inquilino</tt>
	 * @return lista de resultados, del tipo <tt>Resultado</tt>
	 * */
	public List<Resultado> calcularResultados(List<Inquilino> inquilinos){
		
		List<Resultado> resultados = null;
		
		if(inquilinos!=null){
			resultados = new LinkedList<Resultado>();
			
			// Rellena lista de resultado
			int id=0;
			for(Inquilino inq: inquilinos){
				if(inq.getRelacionesFondos()!=null && inq.getRelacionesFondos().size()>0){
					id++;
					Resultado result = new Resultado();
					result.setIdResultado(id);
					result.setAnio(2012);
					result.setMes(1);
					result.setInquilino(inq);
					if(inq.getHabitacion()!=null){
						result.setPrecioHabitacion(inq.getHabitacion().getPrecio());
					}else{
						result.setPrecioHabitacion(0f);
					}
					
					inq.getResultados().add(result);
					resultados.add(result);
				}
			}
			
			// Calcula el comun y el total de los resultado
			for(Resultado result: resultados){
				Inquilino inq = result.getInquilino();
				for(RelacionFondo rel: inq.getRelacionesFondos()){
					if(rel.getFondo().getTipoFondo().equals("L")){
						result.setLuz(rel.getFondo().getCantidad()/(float)rel.getFondo().getNumParticipaciones());
						result.setTotal(result.getPrecioHabitacion() + result.getLuz() + result.getComun());
					}else{
						float cantAportada = 0f;
						for(AportacionFondo aportacion: rel.getAportaciones()){
							cantAportada += aportacion.getCantidad();
						}
						float proporcion = cantAportada/(float)rel.getFondo().getNumParticipaciones();
						result.setComun(result.getComun() + proporcion - cantAportada);
						result.setTotal(result.getPrecioHabitacion() + result.getLuz() + result.getComun());
						for(Resultado result2: resultados){
							if(!result2.getInquilino().equals(inq)){
								OperacionesInquilino opeInq = new OperacionesInquilino();
								if(opeInq.tieneFondo(result2.getInquilino(), rel.getFondo())){
									result2.setComun(result2.getComun() + proporcion);
									result2.setTotal(result2.getPrecioHabitacion() + result2.getLuz() + result2.getComun());
								}
							}
						}
					}
				}
			}
		}
		
		return resultados;
	}
	
	
	
}
